{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow.compat.v1 as tf\n",
    "tf.disable_v2_behavior()\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "(55000, 784)\n",
      "(55000,)\n",
      "(5000, 784)\n",
      "(5000,)\n",
      "(10000, 784)\n",
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"./\")\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "可以看到images里面有数量不等的图片，每张图片是28x28长度的一个一维向量， 所以用的时候需要先给它还原成28x28的二维图片。labels中则是图片对应的数字的值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4,4, idx+1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(mnist.train.labels[idx]))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28,28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "接下来，定义用于训练的网络，首先定义网络的输入。\n",
    "\n",
    "这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和lable数据，另外，定义一个float类型的变量用于设置学习率。\n",
    "\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784])\n",
    "y = tf.placeholder(\"int64\", [None])\n",
    "learning_rate = tf.placeholder(\"float\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [],
   "source": [
    "def initialize(shape, stddev=0.1):\n",
    "  return tf.truncated_normal(shape, stddev=0.1)\n",
    "\n",
    "L1_units_count = 30\n",
    "\n",
    "W_1 = tf.Variable(initialize([784, L1_units_count]))\n",
    "b_1 = tf.Variable(initialize([L1_units_count]))\n",
    "logits_1 = tf.matmul(x, W_1) + b_1\n",
    "output_1 = tf.nn.relu(logits_1)\n",
    "\n",
    "L2_units_count = 10 \n",
    "W_2 = tf.Variable(initialize([L1_units_count, L2_units_count]))\n",
    "b_2 = tf.Variable(initialize([L2_units_count]))\n",
    "logits_2 = tf.matmul(output_1, W_2) + b_2  \n",
    "\n",
    "logits = logits_2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits, 这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为可以根据需要设定。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=learning_rate).minimize(cross_entropy_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "需要注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布， 要想看到概率分布，还需要做一下softmax。\n",
    "\n",
    "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(pred, 1), y)\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "saver用于保存或恢复训练的模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 32\n",
    "trainig_step = 2000\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.44031, the validation accuracy is 0.84\n",
      "after 200 training steps, the loss is 0.557509, the validation accuracy is 0.8928\n",
      "after 300 training steps, the loss is 0.183418, the validation accuracy is 0.8972\n",
      "after 400 training steps, the loss is 0.207695, the validation accuracy is 0.9134\n",
      "after 500 training steps, the loss is 0.23786, the validation accuracy is 0.9262\n",
      "after 600 training steps, the loss is 0.109358, the validation accuracy is 0.93\n",
      "after 700 training steps, the loss is 0.163238, the validation accuracy is 0.9362\n",
      "after 800 training steps, the loss is 0.128994, the validation accuracy is 0.9342\n",
      "after 900 training steps, the loss is 0.0594695, the validation accuracy is 0.9424\n",
      "after 1000 training steps, the loss is 0.199044, the validation accuracy is 0.9386\n",
      "after 1100 training steps, the loss is 0.272711, the validation accuracy is 0.9368\n",
      "after 1200 training steps, the loss is 0.180407, the validation accuracy is 0.9412\n",
      "after 1300 training steps, the loss is 0.119812, the validation accuracy is 0.9204\n",
      "after 1400 training steps, the loss is 0.196659, the validation accuracy is 0.942\n",
      "after 1500 training steps, the loss is 0.0428747, the validation accuracy is 0.9554\n",
      "after 1600 training steps, the loss is 0.287588, the validation accuracy is 0.95\n",
      "after 1700 training steps, the loss is 0.276911, the validation accuracy is 0.9332\n",
      "after 1800 training steps, the loss is 0.183788, the validation accuracy is 0.9478\n",
      "after 1900 training steps, the loss is 0.0182366, the validation accuracy is 0.9544\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9396\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss = sess.run(\n",
    "            [optimizer, cross_entropy_loss],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                learning_rate: 0.3\n",
    "            })\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "下面，用我们训练的模型做一个测试。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-1900\n",
      "0.9375\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16]\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx],\n",
    "                                                  order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "有几个数字还是很不错的，但是总体准确率不太理想。\n",
    "原因可能有：只有一个隐层、学习率不是最合适、训练次数不够等等。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
